#include <lib.h>
#include <unistd.h>
#include <acl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "libacl.h"

void usage() {
    printf("Uso: acl_del <archivo> <uid>\n");
    printf("  <archivo> es el archivo cuya ACL se modifica\n");
    printf("  <uid> es el ID (o nombre) de usuario que se quiere eliminar de la ACL\n");
}

int main(argc,argv)
int argc;
char**  argv;
{
    FILE* usrdb;
    char* fname;
    char* usrname;
    char line[256];
    short usr = 0;
    int r;

    if (argc < 3) {
        printf("Error: faltan argumentos!\n");
        usage();
        return MISSING_ARG;
    }
    
    if (strlen(argv[1]) > PATH_MAX) {
        printf("Error: la ruta al archivo es demasiado larga!\n");
        return BAD_PATH;
    }

    fname = argv[1];

    /* Leo el nombre de usuario o UID de la consola */
    usrdb = fopen(PASSWD_FILE, "r");
    if (usrdb != NULL) {
        while(fgets(line, 256, usrdb) != NULL) {
            usrname = strtok(line, ":");
            strtok(NULL, ":");

            if (strcmp(usrname, argv[2]) == 0) {
                usr = atoi(strtok(NULL, ":"));
                break;
            }
        }
        fclose(usrdb);
    }

    if (usr == 0) {
        usr = (short) atoi(argv[2]);
    
        sprintf(line, "%d", usr);
        if (usr == 0 || strcmp(line, argv[2]) != 0) {
            printf("Error: ID de usuario no valido!\n");
            return BAD_USR;
        }
    }

    
    r = acldeluid(fname, usr);
    
    /* Chequeo de errores */
    if (r == INODO_SIN_ACL) {
        printf("Error: el archivo no tiene ACL!\n");
        return r;
    }

    if (r == ERR_PIPE) {
        printf("Error: los pipes no soportan ACL!\n");
        return r;
    }

    if (r == ERR_PRIV) {
        printf("Error: permiso denegado!\n");
        return r;
    }

    if (r == ERR_INODO) {
        printf("Error: no se pudo acceder al archivo!\n");
        return r;
    }

    if (r == ERR_INODO_RO) {
        printf("Error: el archivo es de solo lectura!\n");
        return r;
    }
    
    if (r == ERR_SYS_COPY) {
        printf("Error: se produjo un error al copiar datos!\n");
        return r;
    }

    if (r != ACL_OK) {
        printf("Error: se produjo un error al intentar borrar el ACL!\n");
        return r;
    }

    return r;
}

